﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using DONGACS.Common;
using QLPKWeb.Models.FormBean.NhanVienModel;
using QLPKWeb.Models.LinQ.NhanVien;
using Webdiyer.WebControls.Mvc;

namespace QLPKWeb.BussinessDelegate.NhanVienDelegate
{
    public class NhanVienDelegate
    {
        private NhanVienDataContext db = new NhanVienDataContext();
        int _UserId = Convert.ToInt32(HttpContext.Current.Session["USERID"]);
        int _DeparmentId = Convert.ToInt32(HttpContext.Current.Session["DEPARTMENT"]);
        DateTime _DateNow = DateTime.Now;
        public IList<hs_NhanVien> GetAllNhanVien()
        {
            return db.hs_NhanViens.Where(p => p.IsDelete == false).ToList();
        }

        public hs_NhanVien Insert(hs_NhanVien obj)
        {
            try
            {
                obj.CreateBy = _UserId;
                obj.CreateDate = _DateNow;
                db.hs_NhanViens.InsertOnSubmit(obj);
                db.SubmitChanges();
                return obj;
            }
            catch (Exception)
            {
                return null;
            }
        }
        public hs_NhanVien AddNewNhanVien(hs_NhanVien NhanVien)
        {
            db.hs_NhanViens.InsertOnSubmit(NhanVien);
            db.SubmitChanges();
            return GetLoaiCongChucIdMax();
        }

        public void DeleteNhanVien(int NhanVienID)
        {
            hs_NhanVien NhanVienNew =
                db.hs_NhanViens.Single(p => p.Id == NhanVienID);
            //LoaiCongChuc.Id = LoaiCongChuc.Id;

            db.hs_NhanViens.DeleteOnSubmit(NhanVienNew);
            db.SubmitChanges();
        }

        public int DeleteNhanVien(hs_NhanVien NhanVien)
        {
            try
            {
                hs_NhanVien NhanVienDelete =
                    db.hs_NhanViens.Single(p => p.Id == NhanVien.Id);
                NhanVienDelete.Id = NhanVien.Id;
                NhanVienDelete.UpdateDate = DateTime.Now;
                NhanVienDelete.UpdateBy = Convert.ToInt32(HttpContext.Current.Session["USERID"]);
                NhanVienDelete.IsDelete = true;
                db.SubmitChanges();
                return 1;
            }
            catch (Exception)
            {

                return 0;
            }
        }

        public bool UpdateNhanVien(hs_NhanVien NhanVien)
        {
            try
            {
                hs_NhanVien NhanVienUpdate =
                    db.hs_NhanViens.Single(p => p.Id == NhanVien.Id);
                if (NhanVienUpdate != null && NhanVienUpdate.IsDelete == false)
                {
                    NhanVienUpdate.Id = NhanVien.Id;
                    NhanVienUpdate.Ho = NhanVien.Ho;
                    NhanVienUpdate.SoThe = NhanVien.SoThe;
                    NhanVienUpdate.SoCMND = NhanVien.SoCMND;
                    NhanVienUpdate.NgayCapCMND = NhanVien.NgayCapCMND;
                    NhanVienUpdate.NoiCapCMND = NhanVien.NoiCapCMND;
                    NhanVienUpdate.NoiSinh = NhanVien.NoiSinh;
                    NhanVienUpdate.NgayVaoLam = NhanVien.NgayVaoLam;
                    NhanVienUpdate.NamSinh = NhanVien.NamSinh;
                    NhanVienUpdate.IdTonGiao = NhanVien.IdTonGiao;
                    NhanVienUpdate.IdTinh = NhanVien.IdTinh;
                    NhanVienUpdate.IdDanToc = NhanVien.IdDanToc;
                    NhanVienUpdate.IdPhongBan = NhanVien.IdPhongBan;
                    NhanVienUpdate.IdChucVu = NhanVien.IdChucVu;
                    NhanVienUpdate.DiaChi = NhanVien.DiaChi;
                    NhanVienUpdate.GioiTinh = NhanVien.GioiTinh;
                    NhanVienUpdate.UpdateDate = NhanVienUpdate.UpdateDate;
                    NhanVienUpdate.UpdateBy = NhanVienUpdate.UpdateBy;
                    db.SubmitChanges();
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch(Exception)
            {
                return false;
            }
        }
 
        public PagedList<hs_NhanVien> SearchNhanVienPagedList(int? id, string searchCriteria) // id = page Index
        {
            return
                db.hs_NhanViens.Where(p => p.Ho.Contains(searchCriteria) && p.IsDelete == false).ToPagedList(
                    id ?? 1, CommonVariables.PaggedItemsPerPage);
        }

        public hs_NhanVien GetNhanVienById(string id)
        {
            try
            {
                hs_NhanVien item = this.db.hs_NhanViens.Single(p => p.Id == Convert.ToInt32(id));
                return item;
            }
            catch (Exception)
            {
                return null;
            }
        }

        public hs_NhanVien GetNhanVienByTenCheck(string ten)
        {

            IEnumerable<hs_NhanVien> list = this.db.hs_NhanViens.Where(p => p.Ho == ten && p.IsDelete == false);
            return list.Count() != 0 ? list.ElementAt(0) : null;
        }

        public PagedList<hs_NhanVien> GetNhanVienPagedList(int? id) // id = page Index
        {
            return db.hs_NhanViens.Where(p => p.IsDelete == false).OrderByDescending(p => p.Id).ToPagedList(id ?? 1,
                                                                                                            CommonVariables
                                                                                                                .
                                                                                                                PaggedItemsPerPage);
        }

        public hs_NhanVien BuildNewNhanVien(NhanVienForm form)
        {
            hs_NhanVien newNhanVien = new hs_NhanVien();
            newNhanVien.Ho = form.Ho;
            newNhanVien.SoThe = form.SoThe;
            newNhanVien.SoCMND = form.SoCMND;
            newNhanVien.NgayCapCMND = DateTimeExtension.ConvertStringDDMMYYYYToYYYYMMDD(form.NCCMND);
            newNhanVien.NoiCapCMND = form.NoiCapCMND;
            newNhanVien.NoiSinh = form.NoiSinh;
            newNhanVien.NamSinh = DateTimeExtension.ConvertStringDDMMYYYYToYYYYMMDD(form.NS);
            newNhanVien.IdTonGiao = form.IdTonGiao;
            newNhanVien.IdTinh = form.IdTinh;
            newNhanVien.IdDanToc = form.IdDanToc;
            newNhanVien.IdChucVu = form.IdChucVu;
            newNhanVien.GioiTinh = form.GioiTinh;
            newNhanVien.DiaChi = form.DiaChi;
            newNhanVien.NgayVaoLam = DateTimeExtension.ConvertStringDDMMYYYYToYYYYMMDD(form.NVlam); 
            newNhanVien.CreateBy = Convert.ToInt32(HttpContext.Current.Session["USERID"]);
            newNhanVien.CreateDate = DateTime.Now;
            newNhanVien.IsDelete = false;
            return newNhanVien;
        }

        public int PhucHoiNhanVien(int id)
        {
            hs_NhanVien phuchoi = new hs_NhanVien();
            phuchoi = this.GetNhanVienById(Convert.ToString(id));
            hs_NhanVien item = new hs_NhanVien();
            item = this.GetNhanVienByTenCheck(phuchoi.Ho);
            if (item != null)
                return 1;
            else
            {
                phuchoi.IsDelete = false;
                db.SubmitChanges();
                return 2;
            }
        }

        public hs_NhanVien BuildEditNhanVien(NhanVienForm form)
        {
            hs_NhanVien newNhanVien = new hs_NhanVien();
            newNhanVien.Id = form.Id;
            newNhanVien.Ho = form.Ho;
            newNhanVien.SoThe = form.SoThe;
            newNhanVien.SoCMND = form.SoCMND;
            newNhanVien.NgayCapCMND = DateTimeExtension.ConvertStringDDMMYYYYToYYYYMMDD(form.NCCMND);
            newNhanVien.NoiCapCMND = form.NoiCapCMND;
            newNhanVien.NoiSinh = form.NoiSinh;
            newNhanVien.NamSinh = DateTimeExtension.ConvertStringDDMMYYYYToYYYYMMDD(form.NS);
            newNhanVien.IdTonGiao = form.IdTonGiao;
            newNhanVien.IdTinh = form.IdTinh;
            newNhanVien.IdDanToc = form.IdDanToc;
            newNhanVien.IdChucVu = form.IdChucVu;
            newNhanVien.GioiTinh = form.GioiTinh;
            newNhanVien.DiaChi = form.DiaChi;
            newNhanVien.NgayVaoLam = DateTimeExtension.ConvertStringDDMMYYYYToYYYYMMDD(form.NVlam); 
            newNhanVien.UpdateDate = DateTime.Now;
            newNhanVien.UpdateBy = Convert.ToInt32(HttpContext.Current.Session["USERID"]);
            return newNhanVien;
        }

        public hs_NhanVien GetLoaiCongChucIdMax()
        {
            IList<hs_NhanVien> list = db.hs_NhanViens.ToList();
            return list.Count != 0 ? list.ElementAt(list.Count - 1) : null;
        }

        public NhanVienForm ConvertToForm(hs_NhanVien obj)
        {
            NhanVienForm form = new NhanVienForm();
            form.Id = obj.Id;
            form.Ho = obj.Ho;
            form.Ten = obj.Ten;
            form.SoThe = obj.SoThe;
            form.SoCMND = obj.SoCMND;
            form.NCCMND = string.Format("{0:dd/MM/yyyy}",obj.NgayCapCMND);
            form.NoiCapCMND = obj.NoiCapCMND;
            form.NoiSinh = obj.NoiSinh;
            form.NS = string.Format("{0:dd/MM/yyyy}",obj.NamSinh);
            form.IdTonGiao = obj.IdTonGiao;
            form.IdTinh = obj.IdTinh;
            form.IdDanToc = obj.IdDanToc;
            form.IdChucVu = obj.IdChucVu;
            form.GioiTinh = obj.GioiTinh;
            form.DiaChi = obj.DiaChi;
            form.NVlam = string.Format("{0:dd/MM/yyyy}",obj.NgayVaoLam);
            form.UpdateDate = obj.UpdateDate != null ? obj.UpdateDate.Value : DateTime.MinValue;
            form.CreateDate = obj.CreateDate != null ? obj.CreateDate.Value : DateTime.MinValue;
            form.UpdateBy = obj.UpdateBy != null ? obj.UpdateBy.Value : 0;
            form.CreateBy = obj.CreateBy != null ? obj.CreateBy.Value : 0;
            return form;
        }

        public IQueryable<hs_NhanVien> GetAll(bool? IsDelete, bool? TrangThaiHoanThanh)
        {
            IQueryable<hs_NhanVien> lst = this.GetAll(IsDelete);
            return lst;
        }

        public IQueryable<hs_NhanVien> GetAll(bool? IsDelete)
        {
            IQueryable<hs_NhanVien> lst = this.GetAll();
            if (IsDelete != null)
                lst = lst.Where(p => p.IsDelete == IsDelete.Value);
            return lst;
        }

        private IQueryable<hs_NhanVien> GetAll()
        {
            return db.hs_NhanViens.Where(p => p.IsDelete == false).OrderBy(p => p.Ten);
        }

        public IQueryable<hs_NhanVien> QuickSearch(int? pageNumberId, string SearchObject, string SearchInput)
        {
            IQueryable<hs_NhanVien> lst = null;
            try
            {
                SearchInput = SearchInput.Trim();
                lst = this.GetAll();
                if (SearchObject.Equals("SoThe"))
                    lst = lst.Where(p => p.SoThe.Contains(SearchInput));
                else if (SearchObject.Equals("HoTen"))
                    lst = lst.Where(p => p.Ho.Contains(SearchInput));
                else if (SearchObject.Equals("SoCMND"))
                {
                    lst = lst.Where(p => p.SoCMND.Contains(SearchInput));
                }
                else if (SearchObject.Equals("ChucVu"))
                {
                    lst = lst.Where(p => p.TB_JobTitle.JobTitle == SearchInput);
                }
                else if (SearchObject.Equals("NoiSinh"))
                {
                    lst = lst.Where(p => p.NoiSinh == SearchInput);
                }
            }
            catch (Exception)
            {

            }
            return lst.OrderBy(p =>p.Ten);
        }

        public SelectList BuildChucVu(int IdChucVu)
        {
            SelectList list = new SelectList(db.TB_JobTitles.Where(p => p.IsDelete == false).ToList(), "Id", "JobTitle", IdChucVu);
            return list;
        }
        public SelectList BuildDanToc(int IdDanToc)
        {
            SelectList list = new SelectList(db.dm_DanTocs.Where(p => p.IsDelete == false).ToList(), "Id", "TenDanToc", IdDanToc);
            return list;
        }
        public SelectList BuildTonGiao(int IdTonGiao)
        {
            SelectList list = new SelectList(db.dm_TonGiaos.Where(p => p.IsDelete == false).ToList(), "Id", "TenTonGiao", IdTonGiao);
            return list;
        }
        public SelectList BuildTinh(int IdTinh)
        {
            SelectList list = new SelectList(db.dm_TinhThanhs.Where(p => p.IsDelete == false).ToList(), "Id", "TenTinh", IdTinh);
            return list;
        }

        public hs_NhanVien ConvertToLinq(NhanVienForm form)
        {
            hs_NhanVien obj = new hs_NhanVien();
            obj.SoThe = form.SoThe;
            obj.Ho = form.Ho;
            obj.Ten = form.Ten;
            obj.SoCMND = form.SoCMND;
            obj.NgayCapCMND = DateTimeExtension.ConvertStringDDMMYYYYToYYYYMMDD(form.NCCMND);
            obj.DiaChi = form.DiaChi;
            obj.NoiCapCMND = form.NoiCapCMND;
            obj.NoiSinh = form.NoiSinh;
            obj.NamSinh = DateTimeExtension.ConvertStringDDMMYYYYToYYYYMMDD(form.NS);
            obj.IdChucVu = form.IdChucVu;
            obj.IdDanToc = form.IdDanToc;
            obj.IdTinh = form.IdTinh;
            obj.IdTonGiao = form.IdTonGiao;
            obj.GioiTinh = form.GioiTinh;
            obj.NgayVaoLam = DateTimeExtension.ConvertStringDDMMYYYYToYYYYMMDD(form.NVlam); 
            return obj;
        }

        public hs_NhanVien GetById(int Id)
        {
           return db.hs_NhanViens.Single(p => p.Id == Id);
        }
    }
}